TR1 &&

C++ 버전업은 단순히 언어 자체의 기능 외의 새로운 기능은 대부분 기존의 표준 라이브러리에 추가되는 형태의
버전업이 이루어 진다.
표준 템플릿 라이브러리(Standard Template Library: STL)
주요 구성요소로 컨테이너(vector, string, map 등), 반복자, 알고리즘(find, sort, transform 등),
함수 객체(less, greater 등) 외에 컨테이너 어댑터와
함수 객체 어댑터(stack, priority_queq, mem_fun, not1 등)이 포함됨
iostream
사용자 정의 버퍼링, 국제화 기능이 가능한 입출력을 지원하며,
cin, cout, cerr, clog 등의 사전정의 객체(파일 디스크립터)를 지원한다.
국제화 지원
로케일(locale)을 활성화시킬 수 있는 기능이 포함되어 있다.
wchar_t등의 타입(대개 16비트, 2바이트/문자) 및 wstring(wchar_t로 정의된 string)을
사용해 유니코드 지원
수치 처리 지원
복소수를 나타내는 템플릿(complex) 및 수치 배열을 나타내는 템플릿(valarray) 등 지원
예외 클래스 계통
최상위 클래스인 exception 및 파생클래스 logic_error, runtime_error 등 지원
C89의 표준 라이브러리
1989년 버전 C에 포함된 표준 라이브러리는 전부 C++에도 들어 있음
TR1(Technical Report 1)_C++98 기준
현재는 많은 TR1 라이브러리 내용들이 표준으로 들어가 있음(unique_ptr, shared_ptr 등)
namespace std::tr1에 14개로 구성되어 있다.

    스마트 포인터(smart pointer)
참조 카운팅(reference counting) 포인터 tr1::shared_ptr, tr1::weak_ptr 등
어떤 객체가 가리키는 최후의 스마트 포인터가 소멸될 때(참조 카운터가 0이될 때) 객체도 자동 소멸
shared_ptr이 순환구조로 포인팅 되어 있는 경우를 대비해 weak_ptr을 사용한다.
(weak_ptr은 무효상태(invalid)를 포인팅하고 있을 수가 있음)

    tr1::function
어떤 함수가 가진 시그너처와 호환되는 시그너처를 갖는 함수 호출성 개체(callable entity)의 표현을
가능하게 해주는 템플릿
void registerCallBack(std::string func(int));
// int string
// void registerCallBack(std::string (int));
위와 같은 콜백함수는 int 타입 혹은 int로 변환이 가능한 어떤 타입도 전달 받을 수 있으며,
string 타입 혹은 string으로 변환이 가능한 어떤 타입도 반환할 수 있는 함수를 매개변수로 받을 수 있다.
// tr1::function
void registerCallback(std::tr1::function<std::string (int)> func);
    tr1::bind
기존의 bind 함수와 달리 tr1::bind는 상수 멤버 함수 및 비상수 멤버 함수에 상관없이 동작할 수 있다.
(참조로 전달되는 매개변수에 대해서도 동작함)
    해시 테이블(hash table)
해시 테이블을 이용해 차세대 컨테이너 set, multiset, map, multimap을 구현하는데 사용되었다.
tr1::unordered_set, tr1::unordered_multiset, tr1::unordered_map, tr1::unordered_multimap
(STL의 set, multiset, map, multimap과 달리 순서를 예측할 수는 없음)
    정규 표현식(regulara expression)
정규 표현식 기반의 탐색과 문자열에 대한 대체 연산을 지원, 일치되는 원소들 사이의 순회도 지원
    투플(tuple)
STL의 pair 템플릿의 차세대 버전으로 pair 객체는 두 개만 담을 수 있는 방면,
tr1::tuple 객체는 프로그램상 제한없이 값을 담을 수 있다.(python tuple과 유사)
    tr1::array
STL처럼 begin, end 등 메서드 함수를 지원하는 배열
tr1::array 크기는 컴파일 과정에서 고정된다.(동적 메모리를 사용하지 않음)
    tr1::mem_fn
멤버 함수 포인터를 적응(adapt) 시키는 용도에 쓸 수 있는 템플릿
C++98의 mem_fun, mem_fun_ref 기능을 포함하고 확장되어 있다.
    tr1::reference_wrapper
기존의 참조자를 객체처럼 행세할 수 있도록 만들어 주는 템플릿
이를 이용하면 참조자를 담은 것처럼 동작하는 컨테이너를 생성할 수 있다.
(기존 컨테이너는 객체 혹은 포인터만 담을 수 있음)
    난수 생성
C++은 C 표준 라이브러리 rand함수보다 우수한 난수 발생 기능을 지원함
    특수 용도의 수학 함수
라게르(Laguerre) 다항식, 베셀(Bessel) 함수, 완전 타원 적분(complete ellptic integral) 등
    C99 호환성 확장 기능
C99의 새로운 라이브러리를 C++에서 사용가능하도록 설계된 함수 및 템플릿 모음
(표준 C++은 C89 표준 라이브러리까지만 사용 가능)
    타입 특성 정보(type traits)
주어진 타입에 대한 컴파일 타임 정보를 제공하는 특성정보 클래스의 모음
    tr1::result_of
어떤 함수 호출의 반환 타입을 추론해 주는 템플릿(C++14의 auto, decltype와 유사)
// before C++14
template <typename T, typename U>
auto myFunc(T&& t, U&& u)->decltype(forward<T>(t)+forward<U>(u)){
return forward<T>(t)+forward<U>(u);
};
// after C++14
template <typename T, typename U>
decltype(auto) myFunc(T&& t, U&& u){
return forward<T>(t)+forward<U>(u);
};
TR1의 내용 중에서 일부만 표준 C++ 라이브러리에 포함되어 있다.(TR1은 코드가 아닌 문서임)
boost에서 TR1의 14개의 구성요소 중 10개를 유사하게 제공한다.
boost에서 정의된 tr1 내용은 std::boost 네임스페이스에 존재

개발자들은 tr1에 정의된 내용들을 코드에서 사용할 때는, std::tr1 네임스페이스를 사용하는 규칙을 따른다.
따라서 아래와 같이 std::boost라는 별칭을 std::tr1에 붙여서 사용
namespace std{
namespace tr1=::boost;
}